#pragma once
/* **********************************************************************
 * 项目使用ctemplate::TemplateDictionary库进行前端的渲染工作
 * 找到指定路径的html文件，输入数字典，就可以渲染前端，输出指定被渲染的html路径
 ******************************************************************** */
#include <iostream>
#include <string>
#include <ctemplate/template.h>

#include "oj_model_sql.hpp"

const std::string template_path = "./template_html/";

class View
{
public:
    View() {}
    ~View() {}

public:
    void AllExpandHtml(const std::vector<QuestionDescribe::ptr> &questions, std::string &html)
    {
        // 题目的编号 题目的标题 题目的难度
        // 1. 形成路径
        std::string src_html = template_path + "all_questions.html";
        // 2. 形成数字典
        ctemplate::TemplateDictionary root("all_questions");
        for (const auto &q : questions)
        {
            ctemplate::TemplateDictionary *sub = root.AddSectionDictionary("question_list");
            sub->SetValue("number", q->id);
            sub->SetValue("title", q->title);
            sub->SetValue("star", q->star);
        }

        // 3. 获取被渲染的html
        ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

        // 4. 开始完成渲染功能
        tpl->Expand(&html, &root);
    }
    void OneExpandHtml(const QuestionDescribe::ptr &q, std::string &html)
    {
        // 1. 形成路径
        std::string src_html = template_path + "one_question.html";

        // 2. 形成数字典
        ctemplate::TemplateDictionary root("one_question");
        root.SetValue("number", q->id);
        root.SetValue("title", q->title);
        root.SetValue("star", q->star);
        root.SetValue("desc", q->desc);
        root.SetValue("pre_code", q->code);

        // 3. 获取被渲染的html
        ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

        // 4. 开始完成渲染功能
        tpl->Expand(&html, &root);
    }
};
